//! gossip 协议（gossip protocol）又称 epidemic 协议（epidemic protocol），
//! 是基于流行病传播方式的节点或者进程之间信息交换的协议，在分布式系统中被广泛使用，
//! 比如我们可以使用 gossip 协议来确保网络中所有节点的数据一样。
//! gossip 协议利用一种随机的方式将信息传播到整个网络中，并在一定时间内使得系统内的所有节点数据一致。
//! Gossip 其实是一种去中心化思路的分布式协议，解决状态在集群中的传播和状态一致性的保证两个问题。

#[derive(Debug, Clone, Default)]
pub struct GossipAddress {
    ip: String,
    pub_ip: String,
    rpc_port: i32,
    http_port: i32,
    gossip_port: i32,
}

impl GossipAddress {
    pub fn new(ip: &str, pub_ip: &str, rpc_port: i32, http_port: i32, gossip_port: i32) -> Self {
        Self {
            ip: ip.to_string(),
            pub_ip: pub_ip.to_string(),
            rpc_port,
            http_port,
            gossip_port,
        }
    }

    pub fn ip(&self) -> &str {
        &self.ip
    }

    pub fn pub_ip(&self) -> &str {
        &self.pub_ip
    }

    pub fn rpc_port(&self) -> i32 {
        self.rpc_port
    }

    pub fn http_port(&self) -> i32 {
        self.http_port
    }

    pub fn gossip_port(&self) -> i32 {
        self.gossip_port
    }

    pub fn set_ip(&mut self, ip: &str) {
        self.ip = ip.to_string();
    }

    pub fn set_pub_ip(&mut self, pub_ip: &str) {
        self.pub_ip = pub_ip.to_string();
    }

    pub fn set_rpc_port(&mut self, port: i32) {
        self.rpc_port = port;
    }

    pub fn set_http_port(&mut self, port: i32) {
        self.http_port = port;
    }

    pub fn set_gossip_port(&mut self, port: i32) {
        self.gossip_port = port;
    }
}
